package org.study.mybatisplus.dynamic.boot.service;

import cn.hutool.core.lang.tree.Tree;
import org.study.mybatisplus.dynamic.boot.vo.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 作用描述
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2024年10月21日
 */
public interface StatisticalService {
    /**
     * 发电量统计-子站总发电量统计
     *
     * @param projectId 项目ID
     */
    List<Map<String, String>> electricityStatistics(Long projectId);

    /**
     * 发电量统计-全站发电量统计(横轴为电站)
     *
     * @param projectId 项目ID
     * @param groupType 统计维度：month-按月、year-按年
     * @param datetime  统计时间：按月统计时格式为yyyy-MM、按年统计时格式为yyyy
     */
    List<Map<String, String>> electricityStatistics(Long projectId, String groupType, String datetime);

    /**
     * 发电量统计-全站发电量统计、子站发电量统计(横轴为时间)
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID，为空则统计全部子电站
     * @param groupType      统计维度：month-按月、year-按年
     * @param datetime       统计时间：按月统计时格式为yyyy-MM、按年统计时格式为yyyy
     */
    List<Map<String, String>> electricityStatistics(Long projectId, Long powerStationId, String groupType, String datetime);

    /**
     * 全站(或某个子电站)指定日期的日发电量
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID，为空则统计全部子电站
     * @param datetime       统计时间：格式为yyyy-MM-dd
     */
    BigDecimal getDayElectricity(Long projectId, Long powerStationId, String datetime);

    /**
     * 全站(或某个子电站)指定日期的有功功率
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID，为空则统计全部子电站
     * @param datetime       统计时间：格式为yyyy-MM-dd
     */
    BigDecimal getDayPower(Long projectId, Long powerStationId, String datetime);

    /**
     * 全站(或某个子电站)指定日期的日发电量、月发电量、年发电量、累计发电量、有功功率、无功功率
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID，为空则统计全部子电站
     * @param queryType      查询类型：dp_sc_fdl_dr-数采当日发电量、dp_sc_fdl_dy-数采当月发电量、dp_sc_fdl_dn-数采当年发电量、dp_sc_fdl_lj-数采累计发电量、dp_sc_gl_yg-数采有功功率、dp_sc_gl_wg-数采无功功率
     * @param datetime       统计时间：格式为yyyy-MM-dd
     */
    BigDecimal getShuCaiPropertyValue(Long projectId, Long powerStationId, String queryType, String datetime);

    /**
     * 发电分析-电站下的箱变
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID
     * @param groupType      统计维度：day-按日、month-按月
     * @param datetime       统计时间：按日统计时格式为yyyy-MM-dd、按月统计时格式为yyyy-MM
     */
    List<Map<String, String>> generateElectricity4Xb(Long projectId, Long powerStationId, String groupType, String datetime);

    /**
     * 发电分析-箱变下的逆变器
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID
     * @param xbDeviceId     箱变设备ID
     * @param groupType      统计维度：day-按日、month-按月
     * @param datetime       统计时间：按日统计时格式为yyyy-MM-dd、按月统计时格式为yyyy-MM
     */
    List<Map<String, String>> generateElectricity4Nbq(Long projectId, Long powerStationId, Long xbDeviceId, String groupType, String datetime);

    /**
     * 功率统计-全站功率统计、子站功率统计(横轴为时间)
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID，为空则统计全部子电站
     * @param datetime       统计时间，格式为yyyy-MM-dd
     */
    List<Map<String, String>> powerStatistics(Long projectId, Long powerStationId, String datetime);

    /**
     * 功率统计-电站下的箱变
     *
     * @param projectId        项目ID
     * @param powerStationId   子电站ID
     * @param deviceRelationId 设备关系ID
     * @param datetime         统计时间，格式为yyyy-MM-dd
     */
    List<Map<String, String>> powerStatistics4Xb(Long projectId, Long powerStationId, Long deviceRelationId, String datetime);

    /**
     * 功率统计-箱变下的逆变器
     *
     * @param projectId        项目ID
     * @param powerStationId   子电站ID
     * @param deviceRelationId 设备关系ID
     * @param datetime         统计时间，格式为yyyy-MM-dd
     */
    List<Map<String, String>> powerStatistics4Nbq(Long projectId, Long powerStationId, Long deviceRelationId, String datetime);

    /**
     * 组串离散率分析
     *
     * @param projectId        项目ID
     * @param powerStationId   子电站ID
     * @param deviceRelationId MPPT设备关系ID
     * @param datetime         统计时间，格式为yyyy-MM-dd
     */
    Map<String, List<MpptPvVO>> dispersionRatioAnalyse4Mppt(Long projectId, Long powerStationId, Long deviceRelationId, String datetime);

    /**
     * 某个逆变器的点位实时采集值
     *
     * @param projectId           项目ID
     * @param powerStationId      子电站ID
     * @param nbqDeviceRelationId 逆变器设备关系ID
     */
    List<DeviceRelationWithPropertyValueVO> nbqPropertyValueList(Long projectId, Long powerStationId, Long nbqDeviceRelationId);

    /**
     * 某个逆变器下的MPPT、PV树结构及实时采集值
     *
     * @param projectId           项目ID
     * @param powerStationId      子电站ID
     * @param nbqDeviceRelationId 逆变器设备关系ID
     */
    List<Tree<String>> mpptPvTreeList(Long projectId, Long powerStationId, Long nbqDeviceRelationId);

    /**
     * 某个子电站下电表的采集值
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID
     */
    List<ElectricMeterValueVO> dbPropertyValueList(Long projectId, Long powerStationId);

    /**
     * 按指定类型(按日、按月、按年)及时间查询电表起始、结束功率值
     *
     * @param projectId  项目ID
     * @param deviceId   电表设备ID
     * @param propertyNo 要查询的属性编号
     * @param queryType  查询类型：day-按日、month-按月、year-按年
     * @param datetime   查询时间：查询某日数据时格式为yyyy-MM-dd、查询某月数据时格式为yyyy-MM、查询某年数据时格式为yyyy
     */
    Map<String, Object> dbPowerStatistics(Long projectId, Long deviceId, String propertyNo, String queryType, String datetime);

    /**
     * 某个子电站下电表的采集值
     *
     * @param projectId      项目ID
     * @param powerStationId 子电站ID
     */
    Map<String, Object> dbPropertyValueMap(Long projectId, Long powerStationId);
}
